package com.qf.test;

import com.qf.spring.proxy.FD;
import com.qf.spring.proxy.ZH;
import com.qf.spring.proxy.ZJ;
import com.qf.spring.service.UserService;
import com.qf.spring.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ZFtest {
    @Test
    public void test1(){
        //静态代理的问题：代理类数量过多，不利于项目的管理。
        //多个代码类辅助功能代码冗余，修改时，维护性差
        FD fd = new FD();
        ZH zh = new ZH();
        ZJ zj = new ZJ();
        zj.setChuzuAble(fd);
        zh.setChuzuAble(zj);
        zh.zufang();
    }
    @Test
    public void testDynamic(){
        UserServiceImpl service = new UserServiceImpl();
        //搞一个类似过滤器的东西，在userService的方法执行之前先做事情，在之后又做事情
        //参数1：类加载器，就是为了知道怎么找类
        //参数2，当前要创建的代理对象实现的接口，也就是我们最终返回的对象的类型
        //参数3,当我们调用当前创建的代理对象中的方法的时候做什么
        UserService userService = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
            //参数1，当前正在执行方法的代理对象是谁，参数2，代理对象正在执行哪个方法，参数3，执行方法的时候传递参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = method.invoke(service);
                return null;
            }
        });
        userService.addUser();
        userService.updateUser();
//        UserService userService1 = new UserService() {
//            @Override
//            public void addUser() {
//                System.out.println("开启事务");
//                service.addUser();
//                System.out.println("提交事务");
//            }
//
//            @Override
//            public void updateUser() {
//                System.out.println("开启事务");
//                service.updateUser();
//                System.out.println("提交事务");
//            }
//        };
//        userService1.addUser();
//        userService1.updateUser();

        //对象的创建
        //属性的注入
        //方法的调用
    }
}
